package cn.song.freight.domain.vo;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.math.BigDecimal;
import java.util.Date;

/**
 * 策略区域定价视图对象 (VO)
 * <pre>
 * 用于前端展示策略区域定价信息的视图对象。
 * 包含完整的定价信息以及关联的策略和区域信息。
 *
 * 展示内容：
 * - 定价基本信息
 * - 关联的策略名称和描述
 * - 关联的区域完整名称
 * - 格式化的价格和重量显示
 * - 状态和时间信息
 *
 * 前端友好：
 * - 提供格式化的显示字段
 * - 包含业务状态判断方法
 * - 支持排序和过滤
 *
 * @author SongRenShuo
 * @version 3.0.0
 * @since 2025-08-25
 * </pre>
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
@ApiModel(description = "策略区域定价视图对象")
public class StrategyAreaPricingVO {

    /**
     * 主键ID
     */
    @ApiModelProperty(value = "主键ID")
    private Long id;

    /**
     * 运费策略ID
     */
    @ApiModelProperty(value = "运费策略ID")
    private Long strategyId;

    /**
     * 策略名称
     */
    @ApiModelProperty(value = "策略名称")
    private String strategyName;

    /**
     * 策略描述
     */
    @ApiModelProperty(value = "策略描述")
    private String strategyDescription;

    /**
     * 区域ID
     */
    @ApiModelProperty(value = "区域ID")
    private Long areaId;

    /**
     * 区域完整名称
     */
    @ApiModelProperty(value = "区域完整名称")
    private String areaName;

    /**
     * 省份名称
     */
    @ApiModelProperty(value = "省份名称")
    private String provinceName;

    /**
     * 城市名称
     */
    @ApiModelProperty(value = "城市名称")
    private String cityName;

    /**
     * 区县名称
     */
    @ApiModelProperty(value = "区县名称")
    private String districtName;

    /**
     * 首重重量（kg）
     */
    @ApiModelProperty(value = "首重重量（kg）")
    private BigDecimal firstWeightKg;

    /**
     * 首重资费（元）
     */
    @ApiModelProperty(value = "首重资费（元）")
    private BigDecimal firstWeightFee;

    /**
     * 续重重量（kg）
     */
    @ApiModelProperty(value = "续重重量（kg）")
    private BigDecimal additionalWeightKg;

    /**
     * 每续重单位费用（元）
     */
    @ApiModelProperty(value = "每续重单位费用（元）")
    private BigDecimal additionalWeightFee;

    /**
     * 抛重比（如6000表示1m³按6000kg计费），0表示不启用体积重
     */
    @ApiModelProperty(value = "抛重比（如6000表示1m³按6000kg计费），0表示不启用体积重")
    private BigDecimal volumetricWeightRatio;

    /**
     * 状态：1-启用，2-禁用
     */
    @ApiModelProperty(value = "状态：1-启用，2-禁用")
    private Integer status;

    /**
     * 状态文本
     */
    @ApiModelProperty(value = "状态文本")
    private String statusText;

    /**
     * 创建时间
     */
    @ApiModelProperty(value = "创建时间")
    private Date createTime;

    /**
     * 最后更新时间
     */
    @ApiModelProperty(value = "最后更新时间")
    private Date updateTime;

    /**
     * 操作人
     */
    @ApiModelProperty(value = "操作人")
    private String operator;

    // ================================
    // 格式化显示字段
    // ================================

    /**
     * 首重显示（重量+费用）
     */
    @ApiModelProperty(value = "首重显示")
    private String firstWeightDisplay;

    /**
     * 续重显示（重量+费用）
     */
    @ApiModelProperty(value = "续重显示")
    private String additionalWeightDisplay;

    /**
     * 定价规则简要描述
     */
    @ApiModelProperty(value = "定价规则简要描述")
    private String pricingDescription;

    // ================================
    // 业务方法
    // ================================

    /**
     * 检查定价配置是否启用
     * @return true-启用，false-禁用
     */
    public boolean isEnabled() {
        return Integer.valueOf(1).equals(status);
    }

    /**
     * 获取状态文本
     * @return 状态文本
     */
    public String getStatusText() {
        if (statusText == null) {
            statusText = isEnabled() ? "启用" : "禁用";
        }
        return statusText;
    }

    /**
     * 获取首重显示文本
     * @return 首重显示文本
     */
    public String getFirstWeightDisplay() {
        if (firstWeightDisplay == null && firstWeightKg != null && firstWeightFee != null) {
            firstWeightDisplay = String.format("%s kg / %s 元", firstWeightKg, firstWeightFee);
        }
        return firstWeightDisplay;
    }

    /**
     * 获取续重显示文本
     * @return 续重显示文本
     */
    public String getAdditionalWeightDisplay() {
        if (additionalWeightDisplay == null && additionalWeightKg != null && additionalWeightFee != null) {
            additionalWeightDisplay = String.format("%s kg / %s 元", additionalWeightKg, additionalWeightFee);
        }
        return additionalWeightDisplay;
    }

    /**
     * 获取定价规则描述
     * @return 定价规则描述
     */
    public String getPricingDescription() {
        if (pricingDescription == null) {
            pricingDescription = String.format("首重%skg/%s元，续重%skg/%s元，抛重比%s",
                    firstWeightKg, firstWeightFee,
                    additionalWeightKg, additionalWeightFee,volumetricWeightRatio);
        }
        return pricingDescription;
    }

    /**
     * 设置格式化显示字段
     */
    public void setDisplayFields() {
        getStatusText();
        getFirstWeightDisplay();
        getAdditionalWeightDisplay();
        getPricingDescription();
    }

    /**
     * 检查是否为新创建的记录（24小时内）
     * @return true-新记录，false-旧记录
     */
    public boolean isNewRecord() {
        if (createTime == null) {
            return false;
        }
        long dayInMillis = 24 * 60 * 60 * 1000L;
        return System.currentTimeMillis() - createTime.getTime() < dayInMillis;
    }

    /**
     * 检查是否最近有更新（1小时内）
     * @return true-最近更新，false-无更新
     */
    public boolean isRecentlyUpdated() {
        if (updateTime == null || createTime == null) {
            return false;
        }
        long hourInMillis = 60 * 60 * 1000L;
        // 更新时间晚于创建时间1秒以上
        return updateTime.getTime() - createTime.getTime() > 1000L
                && System.currentTimeMillis() - updateTime.getTime() < hourInMillis;
    }
}
